package example.proxy.singleto;
//懒汉模式的单例 缺陷  线程不安全
//饿汉模式的单例 缺陷 因为类出现就初始化成员变量new出对象结果这个对象没有人使用 浪费内存

//单例 一个类只有一个实例
public class Apple {
    //等号左边的对象是遥控器这个对象名aplle 这个5个字母需要拿内存开辟空间来存  等号右边 new Apple对象 这个对象的成员变量需要内存地址来存
    private static Apple apple;// = new Apple();   //单例 要素 1静态的自己类型成员变量 2. 这个成员变量是私有的  3.构造方法是私有的
    String name;//对象首地址都要4个字节

    private Apple() {

    }

    public   static Apple getInstance(){//需要的时候才new 叫懒汉
        synchronized (Apple.class) {//静态方法同步凭证一定是类 加的是类锁
            if (apple == null) {//1//两个方法调用都执行到这一句 线程1执行完  线程2开始执行    1 1  2   2   3   3
                synchronized (Apple.class) {//静态方法同步凭证一定是类 加的是类锁
                    if (apple == null) {
                        apple = new Apple();//2
                    }
                }
            }
        }
        return apple;//3
    }


}

class Test {
public static void main(String[] args) throws Exception {
 Thread t1 = new TestSingleton();
 Thread t2 = new TestSingleton();
 t1.start();
 t2.start();
 }
}

class TestSingleton extends Thread {
@Override
public void run() {
 Apple apple = Apple.getInstance();
 System.out.println(apple.toString());
 }
}
